// type gender = '男'|'女';
// let sex:gender = '男'
// function searchGetUser(g: gender){}

// 突然有一天,项目经理说,叫男和女太俗了,改成 帅哥美女,如果代码非常多,用到的都要改

// enum Gender {
//     male = "男",
//     female = "女"
// }
// let sex:Gender = Gender.male
// function searchGetUser(g: Gender){}

// enum Level{
//     lev1=2,
//     lev2,
//     lev3 
// }
// let lv: Level = Level.lev2
// console.log('Level',Level);



// 需要对文件操作的权限进行组合

enum Permission {
    Read = 1,   // 2^0  换成二进制  0001
    Write = 2,  // 2^1  换成二进制  0010
    Create = 4, // 2^2  换成二进制  0100
    Delete = 8  // 2^3  换成二进制  1000
}

// 通过二进制的某个位置上是否有1来标记是否有权限

// 3 ==> 0011 对应有 Read Write 权限

// 1. 如何组合权限
// 使用位运算 或运算 
// 把2个数字的二进制的每一位进行比较，
// 0001 0010 => 0011  

let p:Permission = Permission.Read | Permission.Write;
console.log(p) // 3

// 添加权限
p = p | Permission.Create
console.log(p) // 7 ==> 0111

// 2. 如何判断是否有某个权限
function hasPermission(target:Permission, per:Permission){
    // return target === (target | per) 
    return per === (target & per)  // 进行且运算 2个为真才为真 0011 0010 ==> 0010
}
// 判断是否有可读权限
hasPermission(p, Permission.Read)

// 3. 如果删除某个权限
// 异或 位运算 2个位置相同取0 不同取1
// 0111 0010 ==> 0101 ==> 5
p = p ^ Permission.Write 

const isWrite = hasPermission(p, Permission.Write)
console.log('isWrite',isWrite) // false